package grupobbva.pe.operhc.util;

import static grupobbva.pe.operhc.util.Constant.*;
import grupobbva.pe.operhc.domain.Contratacion;

import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.rpc.ServiceException;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.log4j.Logger;

import pe.com.grupobbva.ohc.hy10.CtConOhcHY10Rq;
import pe.com.grupobbva.ohc.hy10.CtConOhcHY10Rs;
import pe.com.grupobbva.ohc.hy10.OHC_HY10_Service;
import pe.com.grupobbva.ohc.hy10.OHC_HY10_ServiceLocator;
import pe.com.grupobbva.ohc.hy20.CtConOhcHY20Rq;
import pe.com.grupobbva.ohc.hy20.CtConOhcHY20Rs;
import pe.com.grupobbva.ohc.hy20.CtPrestamo;
import pe.com.grupobbva.ohc.hy20.CtTarjeta;
import pe.com.grupobbva.ohc.hy20.OHC_HY20_Service;
import pe.com.grupobbva.ohc.hy20.OHC_HY20_ServiceLocator;
import pe.com.grupobbva.ohc.hy30.CtConOhcHY30Rq;
import pe.com.grupobbva.ohc.hy30.CtConOhcHY30Rs;
import pe.com.grupobbva.ohc.hy30.OHC_HY30_Service;
import pe.com.grupobbva.ohc.hy30.OHC_HY30_ServiceLocator;
import pe.com.grupobbva.ohc.hy40.CtConOhcHY40Rq;
import pe.com.grupobbva.ohc.hy40.CtConOhcHY40Rs;
import pe.com.grupobbva.ohc.hy40.OHC_HY40_Service;
import pe.com.grupobbva.ohc.hy40.OHC_HY40_ServiceLocator;
import pe.com.grupobbva.ohc.qf3b.CtConOhcQF3BRq;
import pe.com.grupobbva.ohc.qf3b.CtConOhcQF3BRs;
import pe.com.grupobbva.ohc.qf3b.OHC_QF3B_Service;
import pe.com.grupobbva.ohc.qf3b.OHC_QF3B_ServiceLocator;

public class InvokeWS {
	
	private static Logger logger = Logger.getLogger(InvokeWS.class);
	
	public static CtConOhcHY10Rs consumirHY10(String codigoUsuario, String tipoDocumento, String numeroDocumento, String codigoCentral){
		OHC_HY10_Service serviceLocator = new OHC_HY10_ServiceLocator();
		CtConOhcHY10Rq requestHY10 = new CtConOhcHY10Rq();
		pe.com.grupobbva.xsd.ps9.CtHeaderRq headerRq = new pe.com.grupobbva.xsd.ps9.CtHeaderRq();
		headerRq.setUsuario(codigoUsuario);
		headerRq.setOpcionAplicacion(FN_DEFAULT);
		headerRq.setTerminalLogico(Utilities.TERMINAL_LOGICO);
		headerRq.setTerminalContable(Utilities.TERMINAL_CONTABLE);
		requestHY10.setHeader(headerRq);
		pe.com.grupobbva.ohc.hy10.CtBodyRq bodyRq = new pe.com.grupobbva.ohc.hy10.CtBodyRq();
		bodyRq.setTipoDocumento(tipoDocumento);
		bodyRq.setNumeroDocumento(numeroDocumento);
		bodyRq.setCodigoCentral(codigoCentral);
		bodyRq.setGrupoBuro("");
		bodyRq.setClasificacionBBVA("");
		bodyRq.setIndRelevanciaPublica("");
		bodyRq.setPorcentEndeudamiento("");
		requestHY10.setData(bodyRq);
		CtConOhcHY10Rs response = null;
		try {
			response = serviceLocator.getOHC_HY10_Port().callHY10(requestHY10);
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(response.getHeader(), ToStringStyle.MULTI_LINE_STYLE));
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(response.getData(), ToStringStyle.MULTI_LINE_STYLE));
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (ServiceException e) {
			e.printStackTrace();
		}
		return response;
	}
	
	public static CtConOhcHY20Rs consumirHY20(String codigoUsuario, String tipoOpcion, Contratacion contratacion) {
		OHC_HY20_Service serviceLocator = new OHC_HY20_ServiceLocator();
		CtConOhcHY20Rq requestHY20 = new CtConOhcHY20Rq();
		pe.com.grupobbva.xsd.ps9.CtHeaderRq headerRq = new pe.com.grupobbva.xsd.ps9.CtHeaderRq();
		headerRq.setUsuario(codigoUsuario);
		headerRq.setOpcionAplicacion(tipoOpcion);
		headerRq.setTerminalLogico(Utilities.TERMINAL_LOGICO);
		headerRq.setTerminalContable(Utilities.TERMINAL_FIJO + Utilities.TERMINAL_CLIO);
		requestHY20.setHeader(headerRq);
		pe.com.grupobbva.ohc.hy20.CtBodyRq bodyRq = new pe.com.grupobbva.ohc.hy20.CtBodyRq();
		bodyRq.setTipoDocumento(contratacion.getTipoDocumento());
		bodyRq.setNumeroDocumento(contratacion.getNumeroDocumento());
		bodyRq.setOficinaGestora(contratacion.getOficinaGestora());
		bodyRq.setFamiliaProducto(contratacion.getContrato().getTipoProducto());
		bodyRq.setTipoProducto(contratacion.getFamilia());
		bodyRq.setUsuarioVenta(contratacion.getUsuarioVendedor());
		bodyRq.setCanalVenta(contratacion.getCodigoCanal());
		bodyRq.setSubCanalVenta(contratacion.getCodigoSubCanal());
		if(FN_ALTA_CONTRATO.equals(tipoOpcion)) {
			if(FAMILIA_PRESTAMOS.equalsIgnoreCase(contratacion.getFamilia())) {
				CtPrestamo prestamo = new CtPrestamo();
				prestamo.setSubproducto(contratacion.getContrato().getTipoSubProducto());
				prestamo.setImporte(Utilities.cadenaNumeroDecimal(contratacion.getContrato().getMonto(), CIEN, DIGITOS_IMPORTE));
				prestamo.setPlazo(Utilities.formateaPlazo(contratacion.getContrato().getPlazo()));
				prestamo.setTasa(Utilities.cadenaNumeroDecimal(contratacion.getContrato().getTasa(), MILLON, DIGITOS_TASA));
				prestamo.setCuentaCargo(contratacion.getCuentaCargo());
				prestamo.setGestor(contratacion.getGestor());
				prestamo.setCampanha(contratacion.getCampanha());
				prestamo.setUsuarioAutorizador(contratacion.getUsuarioAutorizador());
				prestamo.setContrato(contratacion.getContrato().getNumeroContrato());
				prestamo.setDiaPago(contratacion.getDiaPago());
				prestamo.setCodigoEstablecimiento(contratacion.getCodigoEstablecimiento());
				bodyRq.setPrestamo(prestamo);
			} else if(FAMILIA_TARJETAS.equalsIgnoreCase(contratacion.getFamilia())) {
				CtTarjeta tarjeta = new CtTarjeta();
				tarjeta.setTipo(contratacion.getContrato().getTipoSubProducto());
				tarjeta.setLimiteCredito(Utilities.cadenaNumeroDecimal(contratacion.getContrato().getMonto(), UNO, DIGITOS_LIMITE));
				tarjeta.setTasa(Utilities.cadenaNumeroDecimal(contratacion.getContrato().getTasa(), MILLON, DIGITOS_TASA));
				tarjeta.setFormaPago(contratacion.getFormaPago());
				tarjeta.setDiaLiquidacion(contratacion.getDiaLiquidacion());
				tarjeta.setNumeroCuenta(contratacion.getCuentaCargo());
				bodyRq.setTarjeta(tarjeta);
			}
		} else if(FN_BAJA_CONTRATO.equals(tipoOpcion)) {
			if(FAMILIA_PRESTAMOS.equalsIgnoreCase(contratacion.getFamilia())) {
				CtPrestamo prestamo = new CtPrestamo();
				prestamo.setContrato(contratacion.getContrato().getNumeroContrato());
				bodyRq.setPrestamo(prestamo);
			} else if(FAMILIA_TARJETAS.equalsIgnoreCase(contratacion.getFamilia())) {
				CtTarjeta tarjeta = new CtTarjeta();
				tarjeta.setContrato(contratacion.getContrato().getNumeroContrato());
				bodyRq.setTarjeta(tarjeta);
			}
		}
		if(logger.isDebugEnabled()) logger.debug(bodyRq);
		requestHY20.setData(bodyRq);
		CtConOhcHY20Rs response = null;
		try {
			response = serviceLocator.getOHC_HY20_Port().callHY20(requestHY20);
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(response.getHeader(), ToStringStyle.MULTI_LINE_STYLE));
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(response.getData(), ToStringStyle.MULTI_LINE_STYLE));
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (ServiceException e) {
			e.printStackTrace();
		}
		return response;
	}
	
	public static CtConOhcHY30Rs consumirHY30(String codigoUsuario, String teclaPulsada, String tipoDocumento, String numeroDocumento, String control) {
		OHC_HY30_Service serviceLocator = new OHC_HY30_ServiceLocator();
		CtConOhcHY30Rq requestHY30 = new CtConOhcHY30Rq();
		pe.com.grupobbva.xsd.ps9.CtHeaderRq headerRq = new pe.com.grupobbva.xsd.ps9.CtHeaderRq();
		headerRq.setUsuario(codigoUsuario);
		headerRq.setOpcionAplicacion(teclaPulsada);
		headerRq.setTerminalLogico(Utilities.TERMINAL_LOGICO);
		headerRq.setTerminalContable(Utilities.TERMINAL_CONTABLE);
		requestHY30.setHeader(headerRq);
		pe.com.grupobbva.ohc.hy30.CtBodyRq bodyRq = new pe.com.grupobbva.ohc.hy30.CtBodyRq();
		bodyRq.setTipoDocumento(tipoDocumento);
		bodyRq.setNumeroDocumento(numeroDocumento);
		bodyRq.setControl(control);
		requestHY30.setData(bodyRq);
		CtConOhcHY30Rs response = null;
		try {
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(requestHY30.getHeader(), ToStringStyle.MULTI_LINE_STYLE));
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(requestHY30.getData(), ToStringStyle.MULTI_LINE_STYLE));
			response = serviceLocator.getOHC_HY30_Port().callHY30(requestHY30);
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(response.getHeader(), ToStringStyle.MULTI_LINE_STYLE));
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(response.getData(), ToStringStyle.MULTI_LINE_STYLE));
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (ServiceException e) {
			e.printStackTrace();
		}
		return response;
	}
	
	public static CtConOhcHY40Rs consumirHY40(String codigoUsuario, String tipoDocumento, String numeroDocumento, BigDecimal cuotaReevaluada){
		OHC_HY40_Service serviceLocator = new OHC_HY40_ServiceLocator();
		CtConOhcHY40Rq requestHY40 = new CtConOhcHY40Rq();
		pe.com.grupobbva.xsd.ps9.CtHeaderRq headerRq = new pe.com.grupobbva.xsd.ps9.CtHeaderRq();
		headerRq.setUsuario(codigoUsuario);
		headerRq.setOpcionAplicacion(FN_DEFAULT);
		headerRq.setTerminalLogico(Utilities.TERMINAL_LOGICO);
		headerRq.setTerminalContable(Utilities.TERMINAL_CONTABLE);
		requestHY40.setHeader(headerRq);
		pe.com.grupobbva.ohc.hy40.CtBodyRq bodyRq = new pe.com.grupobbva.ohc.hy40.CtBodyRq();
		bodyRq.setTipoDocumento(tipoDocumento);
		bodyRq.setNumeroDocumento(numeroDocumento);
		bodyRq.setCuotaReevaluada(Utilities.cadenaNumeroDecimal(cuotaReevaluada, CIEN, DIGITOS_IMPORTE));
		requestHY40.setData(bodyRq);
		CtConOhcHY40Rs response = null;
		try {
			response = serviceLocator.getOHC_HY40_Port().callHY40(requestHY40);
			if(logger.isDebugEnabled()) logger.debug(ToStringBuilder.reflectionToString(response.getHeader(), ToStringStyle.MULTI_LINE_STYLE));
			//if(logger.isDebugEnabled()) logger.debug(response.getData());
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (ServiceException e) {
			e.printStackTrace();
		}
		return response;
	}
	
	public static CtConOhcQF3BRs consumirQF3B(String codigoUsuario){
		OHC_QF3B_Service serviceLocator = new OHC_QF3B_ServiceLocator();
		CtConOhcQF3BRq requestQF3B = new CtConOhcQF3BRq();
		pe.com.grupobbva.xsd.ps9.CtHeaderRq headerRq = new pe.com.grupobbva.xsd.ps9.CtHeaderRq();
		headerRq.setUsuario(codigoUsuario);
		headerRq.setOpcionAplicacion(FN_DEFAULT);
		headerRq.setTerminalLogico(Utilities.TERMINAL_LOGICO);
		headerRq.setTerminalContable(Utilities.TERMINAL_CONTABLE);
		requestQF3B.setHeader(headerRq);
		pe.com.grupobbva.ohc.qf3b.CtBodyRq data = new pe.com.grupobbva.ohc.qf3b.CtBodyRq();
		data.setCodigoUsuario(codigoUsuario);
		requestQF3B.setData(data);
		CtConOhcQF3BRs response = null;
		try {
			response = serviceLocator.getOHC_QF3B_Port().callQF3B(requestQF3B);
			if(logger.isDebugEnabled()) logger.debug(response.getHeader());
			if(logger.isDebugEnabled()) logger.debug(response.getData());
			
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (ServiceException e) {
			e.printStackTrace();
		}
		return response;
	}
	
	
	public static void main(String[] args) {
		List<String> listaContratos = new ArrayList<String>();
		Utilities.BROKER_SOCKET = "118.180.36.26:7808";
		Utilities.TERMINAL_LOGICO = RangoTerminal.getTerminalLogico("7%50-7%59");
		Utilities.TERMINAL_CONTABLE = "7%50";
		CtConOhcHY30Rs rs = consumirHY30("P015270", "00", "L", "29523728", "");
		String[] detalles = rs.getData().getDetalles();
		for (String detalle : detalles) {
			listaContratos.add(detalle);
		}
		
		while(StringUtils.isNotBlank(rs.getData().getControl())) {
			Utilities.TERMINAL_LOGICO = RangoTerminal.getTerminalLogico("7%50-7%59");
			rs = consumirHY30("P015270", "08", "L", "29523728", rs.getData().getControl());
			detalles = rs.getData().getDetalles();
			for (String detalle : detalles) {
				listaContratos.add(detalle);
			}
		}
		
		int i = 0;
		for (Iterator<String> iterator = listaContratos.iterator(); iterator.hasNext();) {
			String string = (String) iterator.next();
			System.out.println((++i) + string);
		}
		
		
		/*CtConOhcQF3BRs rs = consumirQF3B("P007395");
		//if(logger.isDebugEnabled()) logger.debug(Utilities.formateaNumero(new BigDecimal(1500), PATRON_MONEDA, new Integer[] {13, 2}));
		//if(logger.isDebugEnabled()) logger.debug(Utilities.formateaNumero(new BigDecimal(12.457), PATRON_TASA, new Integer[] {3, 6}));
		if(logger.isDebugEnabled()) logger.debug(ArrayUtils.contains(Utilities.splitByPosition(rs.getAplfacu(), 2), "AE"));
		if(logger.isDebugEnabled()) logger.debug(ArrayUtils.toString(Utilities.splitByPosition(rs.getAplfacu(), 2)));
		*/
	}		
}
